﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using Capokun.Models;
using System.Xml.Serialization;
using System.IO;
//using Microsoft.WindowsAzure;
using Capokun;
using System.Data.Services.Client;

namespace Capokun.Controllers
{
	public class AccountController : Controller
	{

		//
		// GET: /Account/LogOn
		public ActionResult LogOn()
		{
			return View();
		}

		//
		// POST: /Account/LogOn
		[HttpPost]
		public ActionResult LogOn(LogOnModel model, string returnUrl)
		{
			if (ModelState.IsValid)
			{
				if (Membership.ValidateUser(model.UserName, model.Password))
				{
					FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
					if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
						&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
					{
						return Redirect(returnUrl);
					}
					else
					{
						return RedirectToAction("Index", "Home");
					}
				}
				else
				{
					ModelState.AddModelError("", "The user name or password provided is incorrect.");
				}
			}

			// If we got this far, something failed, redisplay form
			return View(model);
		}

		//
		// GET: /Account/LogOff

		public ActionResult LogOff()
		{
			FormsAuthentication.SignOut();

			return RedirectToAction("Index", "Home");
		}

		//
		// GET: /Account/Register

		public ActionResult Register()
		{
			return View();
		}

		//
		// POST: /Account/Register

		[HttpPost]
		public ActionResult Register(RegisterModel model)
		{
			if (ModelState.IsValid)
			{
				// Attempt to register the user
				MembershipCreateStatus createStatus;
				Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

				if (createStatus == MembershipCreateStatus.Success)
				{
					FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
					return RedirectToAction("Index", "Home");
				}
				else
				{
					ModelState.AddModelError("", ErrorCodeToString(createStatus));
				}
			}

			// If we got this far, something failed, redisplay form
			return View(model);
		}

		//
		// GET: /Account/ChangePassword

		[Authorize]
		public ActionResult ChangePassword()
		{
			return View();
		}

		//
		// POST: /Account/ChangePassword

		[Authorize]
		[HttpPost]
		public ActionResult ChangePassword(ChangePasswordModel model)
		{
			if (ModelState.IsValid)
			{

				// ChangePassword will throw an exception rather
				// than return false in certain failure scenarios.
				bool changePasswordSucceeded;
				try
				{
					MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
					changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
				}
				catch (Exception)
				{
					changePasswordSucceeded = false;
				}

				if (changePasswordSucceeded)
				{
					return RedirectToAction("ChangePasswordSuccess");
				}
				else
				{
					ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
				}
			}

			// If we got this far, something failed, redisplay form
			return View(model);
		}

		//
		// GET: /Account/ChangePasswordSuccess

		public ActionResult ChangePasswordSuccess()
		{
			return View();
		}

		/// <summary>
		/// show all songs
		/// </summary>
		/// <param name="id"></param>
		/// <returns></returns>
		public ActionResult Admin()
        {
            return View(CapokunContext.GetAllSongs().OrderBy(song => song.SongId).ToList());
        }

		[HttpPost]
		public ActionResult Admin(Song anything)
		{
			try
			{
				//List<Song> currentSongs = new List<Song>();
				//currentSongs = CapokunContext.GetAllSongs();

				//List<Song> duplicateSong = new List<Song>();
				//Dictionary<string, Song> songBySongId = new Dictionary<string, Song>();

				//var account = CloudStorageAccount.FromConfigurationSetting("SongDataConnectionString");
				//var context = new CapokunContext(account.TableEndpoint.ToString(), account.Credentials);

				///fill db
				//List<Song> songs = CapokunContext.GetAllSongs();

				//foreach (var song in songs)
				//{
				//    context.AddSong(song.SongId, song.Link, song.Content, song.SubmittedBy);
				//}

				///clean duplicates
				//foreach (var song in currentSongs)
				//{
				//    if (songBySongId.ContainsKey(song.SongId))
				//    {
				//        duplicateSong.Add(song);
				//    }
				//    else
				//    {
				//        songBySongId.Add(song.SongId, song);
				//    }
				//}

				//List<Song> songsFromXml = deserializeFromXML("CapoSongs.xml");
				//foreach (var song in songsFromXml)
				//{
				//    if (!returned.Contains(song))
				//    {
				//        CapokunContext.AddSong(song);
				//    }
				//}

				//foreach (var song in duplicateSong)
				//{
				//    CapokunContext.DeleteSong(song.SongId);
				//}


				//return View(currentSongs);
				//this.SongList.DataSource = context.Songs;
				//this.SongList.DataBind();
				return View();
			}
			catch (DataServiceRequestException)
			{
				//statusSong = "Unable to connect to the table service. Please check that the service is running.<br>"
				//                 + ex.Song;
				return View();
			}
		}

		private List<Song> deserializeFromXML(string fileName)
		{
			List<Song> songs = new List<Song>();
			string xmlpath = Server.MapPath(Url.Content("~/Content/" + fileName));

			if (System.IO.File.Exists(xmlpath))
			{
				XmlSerializer deserializer = new XmlSerializer(typeof(List<Song>));
				TextReader textReader = new StreamReader(xmlpath);
				songs = (List<Song>)deserializer.Deserialize(textReader);
				textReader.Close();
			}
			return songs;

		}

		#region Status Codes
		private static string ErrorCodeToString(MembershipCreateStatus createStatus)
		{
			// See http://go.microsoft.com/fwlink/?LinkID=177550 for
			// a full list of status codes.
			switch (createStatus)
			{
				case MembershipCreateStatus.DuplicateUserName:
					return "User name already exists. Please enter a different user name.";

				case MembershipCreateStatus.DuplicateEmail:
					return "A user name for that e-mail address already exists. Please enter a different e-mail address.";

				case MembershipCreateStatus.InvalidPassword:
					return "The password provided is invalid. Please enter a valid password value.";

				case MembershipCreateStatus.InvalidEmail:
					return "The e-mail address provided is invalid. Please check the value and try again.";

				case MembershipCreateStatus.InvalidAnswer:
					return "The password retrieval answer provided is invalid. Please check the value and try again.";

				case MembershipCreateStatus.InvalidQuestion:
					return "The password retrieval question provided is invalid. Please check the value and try again.";

				case MembershipCreateStatus.InvalidUserName:
					return "The user name provided is invalid. Please check the value and try again.";

				case MembershipCreateStatus.ProviderError:
					return "The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

				case MembershipCreateStatus.UserRejected:
					return "The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

				default:
					return "An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator.";
			}
		}
		#endregion
	}
}
